package com.tanglongan.designPattern.dp17_memento.demo99;

import lombok.Getter;
import lombok.Setter;

public class GenericClient {

    /**
     * 备忘录
     */
    interface IMemento {
    }

    /**
     * 发起人
     */
    @Getter
    @Setter
    static class Originator {
        private String state;

        /**
         * 创建一个备忘录
         */
        public Memento createMemento() {
            return new Memento(this.state);
        }

        /**
         * 从备忘录恢复
         */
        public void restoreMemento(IMemento memento) {
            this.setState(((Memento) memento).state);
        }

        /**
         * 备忘录作为发起人的内部静态私有类，但是实现了IMemento接口。这样既满足了Originator对备忘录的宽访问权限，也实现了其他类对备忘录的窄访问权限
         */
        private static class Memento implements IMemento {
            private final String state;

            private Memento(String state) {
                this.state = state;
            }
        }
    }

    /**
     * 备忘录管理者
     */
    @Getter
    static class Caretaker {
        private IMemento memento;

        public void storeMemento(IMemento memento) {
            this.memento = memento;
        }
    }

    public static void main(String[] args) {
        //发起人
        Originator originator = new Originator();
        //备忘录管理员
        Caretaker caretaker = new Caretaker();
        //管理员存储发起人的备忘录
        caretaker.storeMemento(originator.createMemento());
        //发起人从管理员获取备忘录进行回滚
        originator.restoreMemento(caretaker.getMemento());
    }

}
